package com.igeek.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 *
 * 之前遇到过的异常：
 *      PointNullException
 *      ClassNotCaseException
 *      OutofBroundsException 超过索引范围的异常
 *
 * 捕获处理异常的
 * 第一种形式：
 * try-catch 捕获异常进行处理
 *
 *      try{
 *          //可能会出现异常的代码，写到这里
 *      }catch(参数是异常对象){
 *          //try中确实发生了一些异常，在这里去处理
 *          //在catch不是所有的异常都能去处理的，能处理的异常，就是catch中指定的参数
 *      }
 * 当try中出现异常，那么就不会再向下执行，而是，直接跳转到catch中，在catch中处理完异常后，程序不会中断，继续向下走
 * 前提是抛的异常，与捕获的异常要一致（不是单纯的相等，子类也可）
 *
 * 第二种形式：
 * try-catch-catch... 多次对异常进行捕获
 *
 *      try{
 *          //可能会出现异常的代码，写到这里
 *      }catch(){
 *          //处理异常1
 *      }catch(){
 *          //处理异常2
 *      }
 *      ....
 *
 * 第三种形式：
 * try-catch...-finally
 *
 *      try{
 *           //可能会出现异常的代码，写到这里
 *      }catch(){
 *          //处理异常
 *      }...
 *      finally{
 *          //代码最终执行，即便是前面出现异常导致程序中断，或者是前面方法做了return
 *          //依旧会执行finally中的代码
 *          //finally的用法：关闭流文件、多线程解锁
 *      }
 * 第四种形式：
 * try-finally 这里就不会对异常做处理，仅是针对finally处理
 *             为了保证代码的事务的一致性，不允许事务中对异常进行捕获处理，就用到了第四种形式
 *             使用finally做一些关闭资源的操作
 */
public class Demo01 {

    public static void main(String[] args) {
        try{
            /*
                有可能会出现异常的代码
                InputMismatchException
                ArithmeticException

             */
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入第一个数:");
            int num1 = scanner.nextInt();

            System.out.println("请输入第二个数:");
            int num2 = scanner.nextInt();

            int result =  num1/num2;

            System.out.println("结果为："+result);

            return;
        }catch (InputMismatchException ex){
            /*
                这里捕获异常时，就需要针对try中出现的异常进行专门的捕获
                如果try中出现的异常是 InputMismatchException 输入不匹配异常
                而catch中捕获的是 NullPointerException
                try - catch 不一致，起不到异常处理的效果
             */
            System.out.println("出现了异常，提示用户：必须输入整数");
            ex.printStackTrace();

        }catch (ArithmeticException ex){

            System.out.println("处理第二种异常。");
            ex.printStackTrace();

        }finally {
            System.out.println("我是最终执行的代码");
        }

        System.out.println("程序执行完毕");
    }
}
